
## 股票算法
class Algorithm():
    def __init__(self,data):
        item = data['item']
        # ["0时间戳","1成交量","2开盘价","3最高价","4最低价","5收盘价","6涨跌额","7涨跌幅","8换手率","9成交额"]
        highlist = []
        lowlist = []
        openlist = []
        prilist = []
        vollist = []
        rangelist = []
        sum = 0
        for i in range(4, -1 ,-1):
            sum = item[i][5] + sum
            highlist.append(item[i][3])
            lowlist.append(item[i][4])
            openlist.append(item[i][2])
            prilist.append(item[i][5])
            vollist.append(item[i][9])
            rangelist.append(item[i][7])
        # 最高价
        self.highlist = highlist
        # 最低价
        self.lowlist = lowlist
        # 开盘价
        self.openlist = openlist
        # 收盘价
        self.prilist = prilist
        # 成交量
        self.vollist = vollist
        # 涨幅
        self.rangelist = rangelist
        # 五日均线
        self.five = sum / 5
    def compare(self,A,B,per):
        # per表示A与B的比例差，为0时
        if(A*100 - B*100 - B*per)>=0:
            return True
        else:
            return False
    def sharesSize1(self):
        ### 形态1（一个大阳线加一根阴线）
        # 当天的收盘价在五日均线以上
        if self.prilist[0] < self.five:
            return False
        # 当天的最低价跟五日均线相差1%之内
        if self.compare(self.lowlist[0],self.five,1):
            return False
        # 昨天的涨幅小于9个点
        # if self.rangelist[1] > 9:
        #     return False
        # 昨天的最高价不能高于收盘价1%
        if self.compare(self.highlist[1],self.prilist[1],1):
            return False
        # 昨天的最低价必须低于前天的最高价
        if self.lowlist[1] > self.highlist[2]:
            return False
        #当天的最高价低于前一天
        if self.highlist[0] > self.highlist[1]:
            return False
        # 当天的成交量要小于前一天
        if self.vollist[0] > self.vollist[1]:
            return False
        # 昨天的涨幅要在5个点以上
        if self.rangelist[1] < 5:
            return False
        # 当天的跌幅要小于昨天的涨幅
        if abs(self.rangelist[0]) > self.rangelist[1] or self.rangelist[0] > 0:
            return False
        # 当天的跌幅大于2个点
        if abs(self.rangelist[0]) < 2:
            return False
        return True
    def sharesSize2(self):
        ### 形态2（一根大阳线加三根小阴线）
        # 第一天涨幅在5点以上
        if self.rangelist[3] < 5:
            return False
        # 第一天的最高价不能高于收盘价一个点
        if self.compare(self.highlist[3],self.prilist[3],1):
            return False
        # 第一天的最低价不能高于上一个交易日的最高价
        if self.lowlist[3] > self.highlist[4]:
            return False
        # 当日价格要在五日线上
        # if self.prilist[0] < self.five:
        #     return False
        # 后面三天的成交量要小于第一天的成交量
        if self.vollist[0] > self.vollist[3] or self.vollist[1] > self.vollist[3] or self.vollist[2] > self.vollist[3]:
            return False
        # 后面三天的都为阴线
        if self.rangelist[0] > 0 or self.rangelist[1] > 0 or self.rangelist[2] > 0:
            return False
        # 后面三天的跌幅小于2%
        if self.rangelist[0] < -2.5 or self.rangelist[1] < -2.5 or self.rangelist[2] < -2.5:
            return False
        # 最后一天的收盘价高于第一天的最低价
        if self.prilist[0] < self.lowlist[3]:
            return False
        return True
    def sharesSize3(self):
        ### 形态3 （两根阴阳线）
        # 两天涨跌幅不相差1%
        if abs(self.rangelist[0] + self.rangelist[1]) > 1:
            return False
        # 两天最高价不相差1%
        if self.compare(self.highlist[0],self.highlist[1],1) or self.compare(self.highlist[1],self.highlist[0],1):
            return False
        # 两天最低价不相差1%
        if self.compare(self.lowlist[0],self.lowlist[1],1) or self.compare(self.lowlist[1],self.lowlist[0],1):
            return False
        # 当天为阳线
        if self.rangelist[0] < 0:
            return False
        # 前一天为阴线
        if self.rangelist[1] > 0:
            return False
        return True
    def sharesSize4(self):
        ### 形态4 （一根大阳/阴线加两根锤子线）
        # 锤子线的涨跌幅小于1%
        if abs(self.rangelist[0]) > 1 or abs(self.rangelist[1]) > 1:
            return False
        # 锤子线的收盘价高于5日线
        if self.prilist[0] < self.five or self.prilist[1] < self.five:
            return False
        # 必须是锤子线（即下影线长于上影线）
        if ((self.openlist[0] + self.prilist[0])/2 - self.lowlist[0]) < (self.highlist[0] - (self.openlist[0] + self.prilist[0])/2):
            return False
        if ((self.openlist[1] + self.prilist[1])/2 - self.lowlist[1]) < (self.highlist[1] - (self.openlist[1] + self.prilist[1])/2):
            return False
        # 大阴线的跌幅必须大于5%
        if abs(self.rangelist[2]) < 5:
            return False
        # 锤子线的成交量必须小于大阴线的成交量
        if self.vollist[0] > self.vollist[2] or self.vollist[1] > self.vollist[2]:
            return False
        return True
